import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios'
import { get, merge } from 'lodash-es'
import { getToken } from './cache/cookies'
import { showToast } from 'vant'
/** 创建请求实例 */
function createService() {
  //创建一个axios实例 命名为 service
  const service = axios.create()
  service.interceptors.request.use(
    config => config,
    error => Promise.reject(error),
  )
  //响应拦截
  service.interceptors.response.use(
    response => {
      //apiData是 api 返回的数据
      const apiData = response.data
      // 二进制数据则直接返回
      const responseType = response.request?.responseType
      if (responseType == 'blob' || responseType == 'arraybuffer')
        return apiData
      //这个statusCode是和后端业务约定的statusCode
      const statusCode = apiData.resultCode
      //如果没有statusCode则代表不是本项目的接口
      if (statusCode === undefined) {
        showToast('网络出错了')
        return Promise.reject(new Error('网络出错了'))
      }
      switch (statusCode) {
        case 0:
          //本系统使用 statusCode === 0 来代表没有业务错误
          return apiData
        case 1:
          //1 报错 没有数据等
          showToast(apiData.data || 'Error')
          return apiData
        default:
          //1 报错 没有数据等
          showToast(apiData.resultMessage || 'Error')
          return apiData
      }
    },
    error => {
      // status 是 HTTP 状态码
      console.log('error:', error)
      const status = get(error, 'response.status')
      switch (status) {
        case 400:
          error.message = '请求错误'
          break
        case 401:
          // Token 过期时
          error.message = 'token已失效 请重新登录'
          break
        case 403:
          error.message = '拒绝访问'
          break
        case 404:
          error.message = '请求地址出错'
          break
        case 408:
          error.message = '请求超时'
          break
        case 500:
          error.message = '服务器内部错误'
          break
        case 501:
          error.message = '服务未实现'
          break
        case 502:
          error.message = '网关错误'
          break
        case 503:
          error.message = '服务不可用'
          break
        case 504:
          error.message = '网关超时'
          break
        case 505:
          error.message = 'HTTP 版本不受支持'
          break
        default:
          break
      }
      showToast(error.message)
      return Promise.reject(error)
    },
  )
  return service
}
/**
 * 创建请求方法
 */
function createRequest(service: AxiosInstance) {
  return function <T>(config: AxiosRequestConfig): Promise<T> {
    const token = getToken()
    const defaultConfig = {
      headers: {
        //携带token
        Authorization: token ? token : undefined,
        'Content-Type': 'application/json',
      },
      baseURL: import.meta.env.VITE_API,
      data: {},
    }
    const mergeConfig = merge(defaultConfig, config)
    return service(mergeConfig)
  }
}

/** 用于网络请求的实例 */
const service = createService()
export const request = createRequest(service)
